// Copyright 2023 Ant Group Co., Ltd.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#[macro_export]
macro_rules! errno {
    ($errno_expr: expr, $($arg:tt)*) => {{
        let error = Error::new($errno_expr, format!($($arg)*), Some(ErrorLocation::new(file!(), line!())));
        error
    }};
}

#[macro_export]
macro_rules! cm_assert {
    ($cond: expr, $($arg:tt)*) => {{
        if !$cond {
            return Err(errno!(ErrorCode::AssertErr, $($arg)*))
        }
    }}
}

#[macro_export]
macro_rules! cm_assert_eq {
    ($left:expr, $right:expr) => {{
        cm_assert!(
            $left == $right,
            "{} not equal to {}",
            stringify!($left),
            stringify!($right)
        );
    }};
}

#[macro_export]
macro_rules! return_errno {
    ($errno_expr: expr, $($arg:tt)*) => {{
        return Err(errno!($errno_expr, $($arg)*));
    }};
}
